package main

import (
	"context"
	"fmt"
	"log"
	"time"

	"github.com/mars/internal/pkg/options"
	"github.com/mars/internal/pkg/wxcloud"
)

func main() {
	// 配置微信云选项
	opts := &options.WxCloudOptions{
		AppId:     "your_app_id_here",
		AppSecret: "your_app_secret_here",
		EnvId:     "your_env_id_here",
	}

	// 创建微信云客户端
	wxClient := wxcloud.NewWxCloudClient(opts, nil)

	// 创建存储管理器
	storageManager := wxcloud.NewStorageManager(wxClient)

	ctx := context.Background()

	// 示例1: 准备文件上传
	fmt.Println("=== 示例1: 准备文件上传 ===")
	uploadInfo, err := storageManager.PrepareFileUpload(ctx, "images", "test_image.jpg")
	if err != nil {
		log.Printf("准备上传失败: %v", err)
	} else {
		fmt.Printf("上传信息: %+v\n", uploadInfo)
	}

	// 示例2: 直接获取上传链接
	fmt.Println("\n=== 示例2: 直接获取上传链接 ===")
	cloudPath := wxcloud.GenerateCloudPath("documents", "test_doc.pdf")
	uploadResp, err := wxClient.GetUploadURL(ctx, cloudPath, "test_doc.pdf")
	if err != nil {
		log.Printf("获取上传链接失败: %v", err)
	} else {
		fmt.Printf("上传链接: %s\n", uploadResp.URL)
		fmt.Printf("文件ID: %s\n", uploadResp.FileID)
		fmt.Printf("上传凭证: %s\n", uploadResp.Token)
		fmt.Printf("授权信息: %s\n", uploadResp.Authorization)
	}

	// 示例3: 获取单个文件下载链接
	fmt.Println("\n=== 示例3: 获取单个文件下载链接 ===")
	fileID := "cloud://test-env.xxx/images/test_image.jpg"
	maxAge := int64(3600) // 1小时有效期

	downloadURL, err := storageManager.GetFileDownloadURL(ctx, fileID, maxAge)
	if err != nil {
		log.Printf("获取下载链接失败: %v", err)
	} else {
		fmt.Printf("下载链接: %s\n", downloadURL)
	}

	// 示例4: 获取文件完整信息
	fmt.Println("\n=== 示例4: 获取文件完整信息 ===")
	fileInfo, err := storageManager.GetFileInfo(ctx, fileID, maxAge)
	if err != nil {
		log.Printf("获取文件信息失败: %v", err)
	} else {
		fmt.Printf("文件信息: %+v\n", fileInfo)
	}

	// 示例5: 批量获取下载链接
	fmt.Println("\n=== 示例5: 批量获取下载链接 ===")
	fileIDs := []string{
		"cloud://test-env.xxx/images/test1.jpg",
		"cloud://test-env.xxx/images/test2.jpg",
		"cloud://test-env.xxx/documents/test.pdf",
	}

	downloadURLs, err := storageManager.BatchGetDownloadURLs(ctx, fileIDs, 7200)
	if err != nil {
		log.Printf("批量获取下载链接失败: %v", err)
	} else {
		fmt.Println("批量下载链接:")
		for fileID, url := range downloadURLs {
			fmt.Printf("  %s -> %s\n", fileID, url)
		}
	}

	// 示例6: 删除单个文件
	fmt.Println("\n=== 示例6: 删除单个文件 ===")
	deleteFileID := "cloud://test-env.xxx/temp/temp_file.txt"
	err = storageManager.DeleteFileByID(ctx, deleteFileID)
	if err != nil {
		log.Printf("删除文件失败: %v", err)
	} else {
		fmt.Printf("文件删除成功: %s\n", deleteFileID)
	}

	// 示例7: 批量删除文件
	fmt.Println("\n=== 示例7: 批量删除文件 ===")
	deleteFileIDs := []string{
		"cloud://test-env.xxx/temp/temp1.txt",
		"cloud://test-env.xxx/temp/temp2.txt",
	}

	err = storageManager.BatchDeleteFiles(ctx, deleteFileIDs)
	if err != nil {
		log.Printf("批量删除文件失败: %v", err)
	} else {
		fmt.Println("批量删除文件成功")
	}

	// 示例8: 完整的上传流程演示
	fmt.Println("\n=== 示例8: 完整的上传流程演示 ===")

	// 1. 准备上传
	fileName := "user_avatar.png"
	dir := "avatars"

	uploadInfo, err = storageManager.PrepareFileUpload(ctx, dir, fileName)
	if err != nil {
		log.Printf("准备上传失败: %v", err)
		return
	}

	fmt.Printf("步骤1 - 上传准备完成: FileID=%s\n", uploadInfo.FileID)

	// 在实际应用中，这里你会使用获得的上传链接来上传文件
	// 上传完成后，你可以立即获取下载链接

	// 2. 模拟上传完成后，获取下载链接
	time.Sleep(1 * time.Second) // 模拟上传时间

	downloadInfo, err := storageManager.GetFileInfo(ctx, uploadInfo.FileID, 7200)
	if err != nil {
		log.Printf("获取下载信息失败: %v", err)
	} else {
		fmt.Printf("步骤2 - 下载链接获取成功: %s\n", downloadInfo.DownloadURL)
	}

	// 示例9: 工具函数演示
	fmt.Println("\n=== 示例9: 工具函数演示 ===")

	// 生成云存储路径
	cloudPath1 := wxcloud.GenerateCloudPath("", "simple_file.txt")
	cloudPath2 := wxcloud.GenerateCloudPath("uploads/docs", "document.pdf")
	fmt.Printf("生成的云路径1: %s\n", cloudPath1)
	fmt.Printf("生成的云路径2: %s\n", cloudPath2)

	// 从文件ID解析文件名
	sampleFileID := "cloud://test-env.xxx/uploads/docs/1642680000_document.pdf"
	fileName = wxcloud.ParseFileIDToPath(sampleFileID)
	fmt.Printf("从文件ID解析的文件名: %s\n", fileName)

	fmt.Println("\n=== 微信云存储示例完成 ===")
}
